/**
 * 
 */
package arbreAbstrait;

/**
 *	<b>Classe Arbre</b>
 */
public class Arbre {
	
	private int taille;
	private Element tab[];

	/**
	 * <b>Constructeur : Arbre</b></br>
	 * 
	 * <p>Créer une instance d'Arbre d'une hauteur passée en parramètre. 
	 * Les valeurs de chaque noeuds seront initialisées à -1.</p>
	 * @param tailleArbre la taille du tableau
	 */
	public Arbre(int tailleArbre) 
	{
		this.taille = tailleArbre;
		this.tab = new Element[this.taille];
		for(int i=0; i<this.taille; ++i)
		{
			this.setNoeud(-1,i);
		}
	}
	
	public Element getElement(int indice)
	{
		if(this.getTaille()>indice)
		{
			return tab[indice];
		}
		else 
		{
			return new Element(-1);
		}
	}
	
	public int getTaille() {
		return taille;
	}

	public void setTaille(int taille) {
		this.taille = taille;
	}
	
	public void setNoeud(int valeur, int indice)
	{
		if (indice < this.getTaille())
		{
			this.tab[indice]=new Element(valeur,indice);
		}
	}
	
	public boolean desequilibre(int indice)
	{
		if((this.getElement(indice*2+1).getValeur()==-1)&&(this.getElement(indice*2).getValeur()==-1))
		{
			return true;
		}
		if((this.getElement(indice*2+1).getValeur()==-1)||(this.getElement(indice*2).getValeur()==-1))
		{
			return false;
		}
		if((desequilibre(2*indice+1))&&(desequilibre(2*indice)))
		{
			return true;
		}
		return false;
	}

	/**
	 * <b>Méthode : afficheArbre</b></br>
	 * Affiche l'arbre en console.
	 * 
	 * @param index L'indice du noeud à afficher, 1 pour la racine
	 * @param espace Le nombre d'espace à afficher avant l'arbre
	 */
	public void afficheArbre(int index, int espace) 
	{
		if(this.tab != null)
		{
				if(2*index+1<this.taille) 
				{
					this.afficheArbre(2*index+1, espace+2);
				}
				
				for(int i=0; i<espace; ++i)
				{
					System.out.print(" ");
				}
				
				if(this.tab[index].getValeur()!=-1)
				{
					System.out.print(this.tab[index].getValeur()+"\n");
				}
				else
				{
					System.out.print("\n");
				}
				
				if(2*index<this.taille)
				{
					espace = espace+2;
					this.afficheArbre(2*index, espace);
				}
		}
	}

	public int hauteurArbre()
	{
		return taille;
		
	}
	
}
